perm filename MN[IAL,BGB] blob
sn#144452 filedate 1975-02-12 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00004 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 ALTERNATE PDP-10 MNEMONICS.
C00005 00003 SAIL LIKE SUBROUTINE LINKAGE.
C00009 00004 LINK MACROS
C00017 ENDMK
C⊗;
;ALTERNATE PDP-10 MNEMONICS.
OPDEF DIP[HRLM]↔OPDEF DAP[HRRM]
OPDEF CAR[HLRZ]↔OPDEF CDR[HRRZ]
OPDEF LAC[MOVE]↔OPDEF DAC[MOVEM]↔OPDEF GO[JRST]
OPDEF FLOAT[FSC 233]↔OPDEF FIXX[FIX 233000]
;RETURN FROM AN N-ARGUMENT SUBROUTINE CALL.
↓P←←17
↓POP0J.:POPJ P, ↔DEFINE POP0J<GO POP0J.>
↓POP1J.:SUB P,[2(2)]↔GO@2(P)↔DEFINE POP1J<GO POP1J.>
↓POP2J.:SUB P,[3(3)]↔GO@3(P)↔DEFINE POP2J<GO POP2J.>
↓POP3J.:SUB P,[4(4)]↔GO@4(P)↔DEFINE POP3J<GO POP3J.>
↓POP4J.:SUB P,[5(5)]↔GO@5(P)↔DEFINE POP4J<GO POP4J.>
;ACCUMULATOR AND TEMPORARY DATA MANAGEMENT.
DEFINE ACCUMULATORS(LIST){ACPTR←←2 ;DECLARE ACCUMULATORS.
FOR AC⊂(LIST)<AC←ACPTR↔ACPTR←←ACPTR+1↔>}
FOR @$ I←0,16<AC.$I←I↔> ;ACCUMULATOR NAMES FOR RAID.
DEFINE DECLARE (LIST){
FOR VARNAM⊂(LIST)<VARNAM:0↔>}
;MACROS TO SAVE AND RESTORE AC'S - SAVAC, GETAC.
DEFINE SAVAC $(N){LAC[XWD 2,[AC2: FOR I←2,N{0↔}]]↔BLT AC2+N-2}
DEFINE GETAC (N){LAC[XWD AC2,2]↔BLT N}
;FATAL ERROR MESSAGE.
DEFINE FATAL(STR){PUSHJ P,FATAL.↔OUTSTR[ASCIZ|STR|]}
DEFINE WARNING(STR){PUSHJ P,WARN.↔OUTSTR[ASCIZ|STR|]}
DEFINE CRLF{OUTSTR[BYTE(7)15,12]}
FATAL.: XCT@(P)↔AOS(P)↔INCHRW↔CAIE "C"↔GO .-2↔POP0J
WARN.: XCT@(P)↔AOS(P)↔INCHRW↔POPJ P,
;SAIL LIKE SUBROUTINE LINKAGE.
DEFINE CAT $(A,B){A$B} ;CONCATENATION.
.PLEVEL←←0 ;PDL BACK POINTER.
.SLEVEL←←0 ;DEPTH OF NESTED SUBROUTINE DECLARATIONS.
;SUBROUTINE DECLARATION MACROS - SUBR & ENDR.
;(Reminder: Right-arrow, "→" is FAIL's macro arg EVAL).
DEFINE SUBR(NAME,X1,X2,X3,X4,X5)↔{BEGIN NAME↔INTERN NAME
GLOBAL .PLEVEL↔GLOBAL .SLEVEL↔.SLEVEL←←.SLEVEL+1
CAT(.SBR,→.SLEVEL)←←.PLEVEL ↔.PLEVEL←←.PLEVEL+1
IFDIF<><X1>{DEFARG(X1,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1
IFDIF<><X2>{DEFARG(X2,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1
IFDIF<><X3>{DEFARG(X3,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1
IFDIF<><X4>{DEFARG(X4,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1
IFDIF<><X5>{DEFARG(X5,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1}}}}}
XWD 777000+.PLEVEL-CAT(.SBR,→.SLEVEL)-1,[SIXBIT|NAME|]
↓NAME:;}
;DEFINE ARGUMENT NAME MACRO.
DEFINE DEFARG(NAME,LEVEL){DEFINE NAME{LEVEL-.PLEVEL(17)}}
;SUBROUTINE TERMINATION MACRO.
DEFINE ENDR{.PLEVEL←←CAT(.SBR,→.SLEVEL)
.SLEVEL←←.SLEVEL-1↔LIT↔BLOCK 0↔IFN 0{XPUNGE}↔BEND }
;SUBROUTINE CALLING MACROS - CALL & SETQ.
DEFINE CALL(NAME,X1,X2,X3,X4,X5)
{GLOBAL .SLEVEL,.PLEVEL↔.SLEVEL←←.SLEVEL+1
CAT(.SBR,→.SLEVEL)←←.PLEVEL
IFDIF<><X1>{PUSH P,X1↔.PLEVEL←.PLEVEL+1
IFDIF<><X2>{PUSH P,X2↔.PLEVEL←.PLEVEL+1
IFDIF<><X3>{PUSH P,X3↔.PLEVEL←.PLEVEL+1
IFDIF<><X4>{PUSH P,X4↔.PLEVEL←.PLEVEL+1
IFDIF<><X5>{PUSH P,X5↔.PLEVEL←.PLEVEL+1 }}}}}
IFDIF<><NAME>{PUSHJ P,NAME }
.PLEVEL←←CAT(.SBR,→.SLEVEL)↔.SLEVEL←←.SLEVEL-1}
DEFINE SETQ(VAR,LIST){CALL(LIST)↔DAC 1,VAR}
;STACK ACCESSING MACROS - PUSHP & POPP.
DEFINE PUSHP(ARG){PUSH P,ARG↔.PLEVEL←←.PLEVEL+1}
DEFINE POPP(ARG) {POP P,ARG↔.PLEVEL←←.PLEVEL-1}
;LINK MACROS
DEFINE LEFT $(NAM,WRD,Z){
IFIDN<><Z><DEFINE NAM(A,Q)<HLRZ A,WRD(Q)>>
IFDIF<><Z><DEFINE NAM(A,Q)<HLRE A,WRD(Q)>>
DEFINE NAM$.(A,Q)<HRLM A,WRD(Q)>}
DEFINE RIGHT $(NAM,WRD,Z){
IFIDN<><Z><DEFINE NAM(A,Q)<HRRZ A,WRD(Q)>>
IFDIF<><Z><DEFINE NAM(A,Q)<HRRE A,WRD(Q)>>
DEFINE NAM$.(A,Q)<HRRM A,WRD(Q)>}
;TYPE BIT OPERATIONS.
DEFINE MARK(Q,BITS){
IFE <BITS>⊗-22,{MOVEI BITS}
IFN <BITS>⊗-22,{MOVSI<BITS>⊗-22}
IORM(Q)}
DEFINE MARKZ(Q,BITS){
IFE <BITS>⊗-22,{MOVEI BITS}
IFN <BITS>⊗-22,{MOVSI<BITS>⊗-22}
ANDCAM (Q)}
DEFINE TEST(Q,BITS){
IFDIF<><Q><LAC(Q)>
IFE <BITS>⊗-22,{TRNN BITS}
IFN <BITS>⊗-22,{TLNN<BITS>⊗-22}}
DEFINE TESTZ(Q,BITS){
IFDIF<><Q><LAC(Q)>
IFE <BITS>⊗-22,{TRNE BITS}
IFN <BITS>⊗-22,{TLNE<BITS>⊗-22}}